﻿#define _CRT_SECURE_NO_WARNINGS
// ↑ 将本行在代码放在第一行可以避免 scanf的报错问题（仅在VS编译器里）

//【入门】7.类和对象(6)



//【头文件包含】
//C++的主要头文件
#include<iostream>//c++的输入输出流
using std::cout, std::endl,std::cin;
using std::ostream, std::istream;
//C的主要头文件
//#include<stdio.h>
//#include<stdlib.h>
//#include<assert.h>
//#include<string.h> 




//【命名空间】

//【结构体声明】【类声明】
/*仅利用加法赋值实现机械累加器*/
class Sum
{
public:
    Sum()
    {
        _sum += _i;
        ++_i;
    }
    static int GetSum()
    {
        return _sum;
    }
    ~Sum()
    {
        _sum = 0;
        _i = 1;
    }
private:
    static int _i;
    static int _sum;
};
int Sum::_i = 1;
int Sum::_sum = 0;
/*调用函数*/class Solution
{
public:
    int mechanicalAccumulator(int target)
    {
        Sum* a=new Sum[target];
        int ret = Sum::GetSum(); 
        delete[] a;
        return ret;
    }
};
/*********************************/
/*实践：实现一个完善的日期类*/class Date
{
    friend void Test2();
    friend ostream& operator<<(ostream& out, const Date& d);
    friend istream& operator>>(istream& in, Date& d);
public:
    /*根据年月获取当月天数*/int GetMonthDay(int year, int month)
    {
        static int monthDays[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
        if (month == 2 && (year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        {
            return 29;
        }
        return monthDays[month];
    }
    /*构造函数*/Date(int year=0, int month=1, int day=1)
        //:_year(0), _month(1),_day(1)
    {
        if (year >= 0 && month >= 1 && month <= 12 && day >= 1 && day <= GetMonthDay(year, month))
        {
            _year = year; _month = month; _day = day;
        }
        else cout << "date illegel" << endl;

    }
    /*打印日期*/void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }

private:
    int _year=0;
    int _month=1;
    int _day=1;
};
ostream& operator<<(ostream& out, const Date& d)
{
    out << d._year << "/" << d._month << "/" << d._day << endl;
    return out;
}
istream& operator>>(istream& in,Date& d)
{
    in >> d._year >> d._month >> d._day;
    return in;
}
//【函数声明】
void Test1();void Test2();void Test3();


//【主函数】
int main()
{
    
	Test1();
	Test2();
	
	cout << "****主函数结束****" << endl;
	return 0;
}

//【函数定义】
/*测试用例*/void Test1()
{
    cout << "****测试用例开始****" << endl;
    cout << "仅用加法不用判断循环实现机械累加" << endl;
    Solution a1;
    int n = a1.mechanicalAccumulator(4);
    int m = a1.mechanicalAccumulator(5);
    cout << n << " " << m << endl;
    cout << "****测试用例结束****" << endl << endl;
}

/*测试用例*/void Test2()
{
    cout << "****测试用例开始****" << endl;
    Date d;
    d.Print();
    d._year = 2010;
    cout << d._year << endl;
  
    Date d2,d3;
    cin >> d2>>d;
    cout << d << d2 << endl;
    cout << "****测试用例结束****" << endl << endl;
}

/*测试用例*/void Test3()
{
    cout << "****测试用例开始****" << endl;

    
    cout << "****测试用例结束****" << endl << endl;
}

//【笔记】

//【入门】7.类和对象(6)
//类的非静态成员变量带缺省声明
	//C++11以上环境，在类的非静态成员变量声明时给一个值视为在声明时给成员变量缺省值
    //【个人分析】给普通非静态成员（非const、非&、非不传参构造函数类的对象）进行带缺省声明，不用再创建初始化列表以消除构造函数提示变量未初始化的警告
//友元函数
    // friend + 函数声明（形式） 放在类中，可以使该函数可以访问非公开的类成员
	// cout - ostream  cin -istream
	// 友元函数不能用const修饰
//友元类
    //friend+ class类名 放在主类中，可以使友元类访问主类的私有成员
    //如果在一个主类中又定义了一个子类，那么子类天生是主类的有元
//再次理解封装
    //面向对象更关注类和类之间的关系
    //工程中封装应高内聚、低耦合，提高可维护性




